// #include <iostream>
// #include <string>
// #include <unistd.h>
// #include <vector>
// #include <sys/types.h>
// #include <unistd.h>


// void work(int rfd)
// {
//     while(true) sleep(1);
// }
// class Channel
// {
// private:
//     /* data */
//     int _wfd;
//     pid_t _subprocessid;
//     std::string _name;
// public:
//     Channel(int wfd,pid_t id,const std::string&name):_wfd(wfd),_subprocessid(id),_name(name)
//     {

//     }

//     int GetWfd(){return _wfd;}
//     pid_t GetProcessId() {return _subprocessid;}
//     std::string GetName() {return _name;}

//     ~Channel()
//     {

//     }
// };


// int main(int argc,char *argv[])
// {
//     if(argc != 2)
//     {
//         std::cerr << "Usage:" << argv[0] << " processum" << std::endl;
//         return 1;
//     }
//     int num = std::stoi(argv[1]);
//     std::vector<Channel> Channels;
//     for(int i = 0;i<num;i++)
//     {
//         //创建管道
//         int pipefd[2]={0};
//         int n = pipe(pipefd);
//         if(n < 0) exit(1);
//         //创建子进程
//         pid_t id = fork();
//         //子进程
//         if(id == 0)
//         {
//             //child
//             close(pipefd[1]);
//             work(pipefd[0]);
//             exit(0);
//         }
//         //构建一个channel名称
//         std::string Channel_name = "Channel-" + std::to_string(i);
//         //父进程
//         close(pipefd[0]);

//         Channels.push_back(Channel(pipefd[1],id,Channel_name));
//     }

//     for(auto &channel :Channels)
//     {
//         std::cout << "============================================================" << std::endl;
//         std::cout << channel.GetName() << std::endl;
//         std::cout << channel.GetProcessId() << std::endl;
//         std::cout << channel.GetWfd() << std::endl;
//     }
//     sleep(100);
//     return 0;
// }




//child->write, father->read                                                                                                                                                                                                                                                                                                                                                                                                                                                        
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
	int fd[2] = { 0 };
	if (pipe(fd) < 0){ //使用pipe创建匿名管道
		perror("pipe");
		return 1;
	}
	pid_t id = fork(); //使用fork创建子进程
    //child->write, father->read    
	if (id == 0){
		//child
		close(fd[0]); //子进程关闭读端
		//子进程向管道写入数据
		const char* msg = "hello father, I am child...";
		int count = 10;
		while (count--)
        {
			write(fd[1], msg, strlen(msg));
			sleep(1);
		}
		close(fd[1]); //子进程写入完毕，关闭文件
		exit(0);
	}
	//father
	close(fd[1]); //父进程关闭写端
	//父进程从管道读取数据
	char buff[64];
	while (1){
		ssize_t s = read(fd[0], buff, sizeof(buff));
		if (s > 0){
			buff[s] = '\0';
			printf("child send to father:%s\n", buff);
		}
		else if (s == 0){
			printf("read file end\n");
			break;
		}
		else{
			printf("read error\n");
			break;
		}
	}
	close(fd[0]); //父进程读取完毕，关闭文件
	waitpid(id, NULL, 0);
	return 0;
}
